package activitys;

import utils.BaseAsync;
import utils.Constantes;
import utils.PreferencesHelper;

import com.example.pasajero.R;

import controladores.ControladorPasajeros;
import controladores.ControladorViajes;

import entidades.Movil;
import entidades.Turno;
import entidades.Viaje;
import entidades.estados.Estados.EstadoViaje;
import entidades.usuarios.Chofer;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ViajeActivity extends BaseActivityCerrarSesion
{
	public static final String ARCHIVO_VIAJE = "viaje.txt";
	
	private Viaje viaje;

	private TextView labelDireccion;
	private TextView labelNombreChofer;
	private TextView labelEstadoViaje;
	
	private TextView labelModeloMovil;
	private TextView labelPatenteMovil;
	
	private TextView labelTiempoEstimado;
	
	private Button botonCancelar;
	
	private BroadcastReceiver receiver;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_viaje);
		
		labelDireccion = (TextView) findViewById(R.id.labelDireccion);
		labelNombreChofer = (TextView) findViewById(R.id.labelNombreChofer);
		labelEstadoViaje = (TextView) findViewById(R.id.labelEstadoViaje);
		labelModeloMovil = (TextView) findViewById(R.id.labelModeloMovil);
		labelPatenteMovil = (TextView) findViewById(R.id.labelPatenteMovil);
		botonCancelar = (Button) findViewById(R.id.botonCancelar);
		labelTiempoEstimado = (TextView) findViewById(R.id.labelTiempoEstimado);
		
		receiver = new ReceptorActivo();
		
		new ActualizarViaje().execute();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.viaje, menu);
		return true;
	}
	
	@Override
	protected void onResume()
	{
		IntentFilter filter = new IntentFilter ("gcm");
		filter.setPriority(2);
		registerReceiver(receiver, filter);
		
		super.onResume();
		
		new ActualizarViaje().execute();
	}
	
	@Override
	protected void onPause()
	{
		unregisterReceiver(receiver);
		
		super.onPause();
	}
	
	public void cancelarViaje (View view)
	{
		if (viaje.getEstado().equals(EstadoViaje.INICIADO))
			new FinalizarViaje().execute();
		else
			new CancelarViaje().execute();
	}
	
	public void actualizarTiempoEstimado (View view)
	{
		new ActualizarTiempoEstimado().execute();
	}
	
	private void actualizarVista ()
	{
		if (viaje != null)
			labelEstadoViaje.setText(viaje.getEstado().toString());
		
		switch (viaje.getEstado())
		{
		case INICIADO:
			labelTiempoEstimado.setVisibility(View.INVISIBLE);
			botonCancelar.setText("Finalizar");
		case ASIGNADO:
			setVisibility(View.VISIBLE);
			labelDireccion.setText(viaje.getPuntos().get(0).getDireccion());
			Turno turno = viaje.getTurno();
			Chofer chofer = turno.getChofer();
			Movil movil = turno.getMovil();
			labelModeloMovil.setText(movil.getMarca() + " " + movil.getModelo());
			labelNombreChofer.setText(chofer.getNombre() + " " + chofer.getApellido());
			labelPatenteMovil.setText(movil.getPatente());
			
			new ActualizarTiempoEstimado().execute();
			
			break;
		case SIN_CHOFER:
			setVisibility(View.INVISIBLE);
			labelDireccion.setText(viaje.getPuntos().get(0).getDireccion());
			break;
		case FINALIZADO:
			alert("RapiTaxi", "Viaje finalizado.");
			break;
		case CANCELADO:
			alert("RapiTaxi", "Viaje cancelado.");
			break;
		default:
			break;
		
		}
	}
	
	private void setVisibility (int v)
	{
		labelModeloMovil.setVisibility(v);
		labelPatenteMovil.setVisibility(v);
		labelNombreChofer.setVisibility(v);
		labelTiempoEstimado.setVisibility(v);
	}
	
	private class ActualizarViaje extends BaseAsync
	{
		public ActualizarViaje ()
		{
			this("Cargando...");
		}
		
		public ActualizarViaje (String mensaje)
		{
			super (ViajeActivity.this, mensaje);
		}

		@Override
		protected Void doInBackground(Void... params)
		{
			viaje = new ControladorViajes().getViajePasajero(new PreferencesHelper(getApplicationContext()).leerID());
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (viaje == null)
			{
				Intent intent = new Intent (ViajeActivity.this, SolicitarActivity.class);
				startActivity(intent);
				finish();
				return;
			}
			
			actualizarVista();
		}
	}
	
	private class CancelarViaje extends BaseAsync
	{
		private boolean lanzar;
		
		public CancelarViaje ()
		{
			super (ViajeActivity.this, "Cancelando...");
		}
		
		@Override
		protected Void doInBackground(Void... arg0)
		{
			lanzar = new ControladorPasajeros().cancelarViaje(viaje.getId());
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (lanzar)
			{
				Intent intent = new Intent (ViajeActivity.this, SolicitarActivity.class);
				startActivity(intent);
				finish();
			}
		}
	}
	
	private class FinalizarViaje extends BaseAsync
	{
		private boolean seguir;
		
		public FinalizarViaje ()
		{
			super (ViajeActivity.this, "Finalizando...");
		}

		@Override
		protected Void doInBackground(Void... arg0)
		{
			seguir = new ControladorPasajeros().finalizarViaje(viaje.getId());
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (seguir)
			{
				Intent intent = new Intent(ViajeActivity.this, SolicitarActivity.class);
				startActivity(intent);
				finish();
			}
		}
	}
	
	private class ActualizarTiempoEstimado extends AsyncTask<Void, Void, Void>
	{
		private String res;
		
		@Override
		protected void onPreExecute()
		{
			super.onPreExecute();
			
			labelTiempoEstimado.setText("Actualizando...");
		}
		
		@Override
		protected Void doInBackground(Void... arg0)
		{
			res = new ControladorViajes().getTiempoEstimado(viaje.getId());
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (res != null)
				labelTiempoEstimado.setText(res);
		}
	}
	
	private class ReceptorActivo extends BroadcastReceiver
	{
		@Override
		public void onReceive(Context context, Intent intent)
		{
			Log.i("LOG", "ViajeActivity, receptor activo recibio GCM.");
			
			abortBroadcast();
			
			try 
			{
			    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
			    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
			    r.play();
			} 
			catch (Exception e) 
			{
			    e.printStackTrace();
			}
			
			String mensaje = "";
			Bundle extras = intent.getExtras();
			
			String tipo = extras.getString("tipo");
			
			switch (tipo)
			{
			case Constantes.TipoGCM.VIAJE_INCIADO:
				mensaje = "Viaje iniciado...";
				break;
			case Constantes.TipoGCM.VIAJE_FINALIZADO:
				alert ("RapiTaxi", "Viaje finalizado.");
				return;
			case Constantes.TipoGCM.CHOFER_ASIGNADO:
				mensaje = "Chofer asignado...";
				break;
			case Constantes.TipoGCM.VIAJE_CANCELADO:
				alert ("RapiTaxi", "Viaje cancelado.");
				return;
			case Constantes.TipoGCM.SIN_CHOFER:
				alert ("RapiTaxi", "No hay moviles disponibles. Por favor intentelo de nuevo.");
				return;
			default:
				mensaje = "Cargando...";
			}
			
			new ActualizarViaje(mensaje).execute();
		}	
	}
	
	private void alert (String titulo, String mensaje)
	{
		sonar();
		AlertDialog alertDialog = new AlertDialog.Builder(ViajeActivity.this).create();
		alertDialog.setTitle(titulo);
		alertDialog.setMessage(mensaje);
		alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Aceptar", new DialogInterface.OnClickListener() 
		{
            @Override
            public void onClick(DialogInterface dialog, int which) 
            {
            	Intent i = new Intent(ViajeActivity.this, SolicitarActivity.class);
				startActivity(i);
				finish();
            }
        });
		alertDialog.show();
	}
	
	private void sonar ()
	{
		try 
		{
		    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
		    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
		    r.play();
		} 
		catch (Exception e) 
		{
		    e.printStackTrace();
		}
	}
}
